#define DEBUG
#include <cstdio>

using namespace std;

const int maxn=100000, maxm=1000000;

class Heap {
	public:
		int k[maxn*10+1], v[maxn*10+1], size=0;

		bool cmp(int x, int y) {
			return k[x]<=k[y];
		}

		void swap(int x, int y) {
			int t;
			t=k[x], k[x]=k[y], k[y]=t;
			t=v[x], v[x]=v[y], v[y]=t;
		}

		void up(int o) {
			if (o>1 && cmp(o, o/2)) {
				swap(o, o/2);
				up(o/2);
			}
		}

		void down(int o) {
			if (((o*2<size && cmp(o*2, o*2+1)) || o*2==size) && cmp(o*2, o)) {
				swap(o*2, o);
				down(o*2);
			} else if ((o*2<size && cmp(o*2+1, o*2)) && cmp(o*2+1, o)) {
				swap(o*2+1, o);
				down(o*2+1);
			}
		}

		void ins(int key, int val) {
			size++;
			k[size]=key, v[size]=val;
			up(size);
		}

		void pop() {
			swap(size--, 1);
			down(1);
		}
};

class Graph {
	public:
		int n, m, ind[maxn+1], to[2*maxm+1], val[2*maxm+1], link[2*maxm+1], cnt[maxn+1];
		bool vis[maxn+1];

		void init(int n, int d) {
			this->n = n;
			m=0;
			for (int i=1; i<=n; i++) {
				cnt[i] = d;
			}
		}

		void addSide(int u, int v, int w) {
			m++;
			to[m] = v;
			val[m] = w;
			link[m] = ind[u];
			ind[u] = m;
		}

		int solve(int pn, int p[]) {
			static Heap que;
			for (int i=1; i<=pn; i++) {
				que.ins(0, p[i]);
				cnt[p[i]] = 0;
			}

			for (; que.size; ) {
				int x=que.v[1], y=que.k[1];
				que.pop();
				if ((--cnt[x])<0 && !vis[x]) {
					vis[x] = true;
					if (x==1) {
						return y;
					}
					for (int i=ind[x]; i; i=link[i]) {
						if (!vis[to[i]]) {
							que.ins(y+val[i], to[i]);
						}
					}
				}
			}
			return -1;
		}
};

int main() {
#ifdef DEBUG
	freopen("src.in", "r", stdin);
	freopen("src.out", "w", stdout);
#endif

	static Graph g;
	static int p[maxn+1];
	int n, m, k, d;
	scanf("%d %d %d %d", &n, &m, &k, &d);
	g.init(n, d);
	for (int i=1; i<=m; i++) {
		int x, y, w;
		scanf("%d %d %d", &x, &y, &w);
		x++, y++;
		g.addSide(x, y, w);
		g.addSide(y, x, w);
	}
	for (int i=1; i<=k; i++) {
		scanf("%d", p+i);
		p[i]++;
	}

	printf("%d", g.solve(k, p));

	fclose(stdin);
	fclose(stdout);
	return 0;
}
